# pragma once

#include <iostream>
#include <ctime>
#include <sys/stat.h>
#include <sys/types.h>
#include <string>

namespace log
{
	namespace util
	{
		class Date
		{
		public:
			//获取系统时间
			static size_t now()
			{
				return (size_t)time(nullptr);
			}
		};

		class File
		{
		public:
			 // 判断文件是否存在
			static bool exists(const std::string& pathname)
			{
				// stat 获取文件属性，获取成功，说明文件存在；获取失败，则文件不存在
				struct stat st;
				if (stat(pathname.c_str(), &st) < 0) return false;
				return true;
			}

			// 获取文件的所在目录路径
			static std::string path(const std::string& pathname)
			{
				// ./abc/a.txt 其实也就是获取最后一个 / 的位置，然后从开头进行截取
				size_t pos = pathname.find_last_of("/\\"); // 这个 find 调用在 windows 和 linux 下都可以，linux 下路径分隔符为 /；而 \ 为转义字符
												           // 要表示一个 \ 需要两个 \，也就是查找 / 和 \ 中的任意一个，linux 下路径不会出现 \ ，所以这里没问题
				if (pos == std::string::npos) return ".";  // 如果没有找到，那么证明这个文件就在当前的目录
				return pathname.substr(0, pos + 1); // 把最后一个 / 也截进去
			}

			// 创建目录
			static void createDirectory(const std::string& pathname)
			{
				// ./abc/bcd/cde
				// pos 是 / 的位置，idx是查找的起始位置
				size_t pos = 0, idx = 0;

				 while (idx < pathname.size())
                {
                    // 查找idx 位置起第一个 /
                    size_t pos = pathname.find_first_of("/\\", idx);
                    if (pos == std::string::npos)
                    { 
						// 创建文件夹,pathname.c_str()表示路径名,0777表示权限
                        mkdir(pathname.c_str(), 0755);
						return;
                    }

					// 截取从开始到/的目录
                    std::string parent_dir = pathname.substr(0, pos + 1);
                    // 目录存在就跳过，找下一个
                    if (exists(parent_dir) == true)
                    {
                        idx = pos + 1;
                        continue;
                    }
                    // 目录不存在，创建目录
                    mkdir(parent_dir.c_str(), 0777);
                    idx = pos + 1;
				}
			}
		};
	}
}